<?php
/**
 *
 * App.php
 * User: kalvin
 * Date: 2018/1/29
 * Time: 下午4:17
 */
namespace Core;
class App
{

    /**
     * 初始化项目
     * 设置请求头
     */
    public static function init(){
        header('content-type:text/html;charset=utf-8');
    }

    /**
     * 定义目录方便以后文件加载更精确
     */
    public static function setDir(){
        //这里使用了str_replace，由于windows目录会有\ 这种斜杠，但是如果去到linux或者unix系统会转义所以还是先替换了
        define('ROOT_PATH',str_replace('\\','/',dirname(__DIR__).'/'));
        define('APP_PATH',ROOT_PATH.'App/');
        define('CONF_PATH',ROOT_PATH.'Conf/');
        define('PUBLIC_PATH',ROOT_PATH.'Public/');
        define('VEND_PATH',ROOT_PATH.'Vendor/');
    }
    
    /**
     * 读取配置文件方便后面使用
     */
    public static function getConf(){
        $GLOBALS['conf']=include CONF_PATH.'app.php';

    }

    /**
     * 获取url，做一些人性化处理首字母大写,并给予默认值
     */
    public static function getUrl(){
        $GLOBALS['p']=isset($_GET['p']) ? ucfirst(strtolower($_GET['p'])) :'Back';
        $GLOBALS['c']=isset($_GET['c']) ? ucfirst(strtolower($_GET['c'])) :'Index';
        $GLOBALS['a']=isset($_GET['a']) ? ucfirst(strtolower($_GET['a'])) :'showIndex';
    }

    /**
     * 分发路由 根据url实例化对象并调用方法
     */
    public static function dispathRouter(){
        //我们的控制器的规则就是名字+Controller关键字
        $className='App\\'.$GLOBALS['p'].'\\Controller\\'.$GLOBALS['c'].'Controller';
        $action=$GLOBALS['a'];
        $obj=new $className;
        $obj->$action();
    }

    /**
     * 自动加载
     */
    public static function autoload(){
        //这里我们用了高阶函数的写法，剩下了一个方法

        spl_autoload_register(function($className){
           if ($className=='Smarty'){
            $fileName=VEND_PATH.'Smarty/'.str_replace('\\','/',$className).'.class.php';
           }else{
               $fileName=ROOT_PATH.str_replace('\\','/',$className).'.php';
           }

           if (file_exists($fileName)){
               include_once $fileName;
               return true;
           }else{
               echo '文件不存在！'.$fileName;
               die;
           }
        });
    }

    /**
     * 1.这个基础功能的入口只要在index.php中静态访问即可
     * 2.我们这个方法静态的理由是不想new 占用过多的内存空间
     * 3.我们项目的命名空间必须等于路径
     */
    public static function run(){
        self::init();
        self::setDir();
        self::getConf();
        self::getUrl();
        self::autoload();
//        self::loadVendor();
        self::dispathRouter();
    }
}